import axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { message } from 'antd';
import { getToken } from './auth';

/**
 * 创建自定义axios实例
 */
const service = axios.create({
    baseURL: '/api/pc',// 公共的请求头 放这里
    timeout: 40000,
    headers: {
        'Access-Control-Allow-Origin': '*',
        'Connection': 'Keep-Alive',
        'Content-Type': 'application/json; charset=utf-8'
    }
});

/**
 * 请求拦截器
 */
service.interceptors.request.use(
    (config) => {
        // 从本地存储获取token并添加到请求头
        const token = getToken();
        if (token && config.headers) {
            config.headers['access-token'] = token;
        }
        return config;
    },
    (error) => {
        console.error('Request error:', error);
        return Promise.reject(error);
    }
);

/**
 * 响应拦截器
 */
service.interceptors.response.use(
    (response) => {
        const { data } = response;

        // 根据响应状态码处理不同情况
        if (data.code === 100) {
            // Token过期或无效
            localStorage.removeItem('token');
            localStorage.removeItem('menus');
            window.location.href = '/login';
            message.error('登录已过期，请重新登录');
        } else if (data.code === 1) {
            // 业务错误
            message.warning(data.msg || '操作失败');
        }

        return response;
    },
    (error) => {
        if (error.response) {
            const { status } = error.response;

            // 根据HTTP状态码处理不同错误
            switch (status) {
                case 401:
                    message.error('未授权，请重新登录');
                    // 清除token并跳转到登录页
                    localStorage.removeItem('token');
                    localStorage.removeItem('menus');
                    window.location.href = '/login';
                    break;
                case 403:
                    message.error('没有权限访问该资源');
                    break;
                case 404:
                    message.error('请求的资源不存在');
                    break;
                case 500:
                    message.error('服务器错误，请稍后重试');
                    break;
                default:
                    message.error(`请求错误: ${status}`);
            }
        } else if (error.request) {
            // 请求已发送但没有收到响应
            message.error('网络错误，服务器未响应');
        } else {
            // 请求配置出错
            message.error(`请求配置错误: ${error.message}`);
        }

        return Promise.reject(error);
    }
);

/**
 * 封装请求方法
 * @param config 请求配置
 * @returns Promise
 */
const request = async <T = any>(config: AxiosRequestConfig): Promise<T> => {
    try {
        const { data } = await service(config);
        return data;
    } catch (error) {
        throw error;
    }
};

/**
 * GET请求
 * @param url 请求地址
 * @param params 请求参数
 * @returns Promise
 */
export const get = <T = any>(url: string, params?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'get',
        params
    });
};

/**
 * POST请求
 * @param url 请求地址
 * @param data 请求数据
 * @returns Promise
 */
export const post = <T = any>(url: string, data?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'post',
        data
    });
};

/**
 * PUT请求
 * @param url 请求地址
 * @param data 请求数据
 * @returns Promise
 */
export const put = <T = any>(url: string, data?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'put',
        data
    });
};

/**
 * DELETE请求
 * @param url 请求地址
 * @param params 请求参数
 * @returns Promise
 */
export const del = <T = any>(url: string, params?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'delete',
        params
    });
};

export default request; 